﻿#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void testSscanf()
{
#if 0
	//1.%*s或%*d，跳过数据；
	char* str = "12345abcde";
	char buf[1024] = { 0 };
	sscanf(str, "%*d%s", buf);
	printf("2.使用sscanf读取字符串str，忽略数字只读取字符，则得到buf为：%s\n", buf);//abcde
#else
	//3.忽略字符串到空格或者到\t；
	//char* str = "abcde 12345";
	char* str = "abcde\t12345";
	char buf[1024] = { 0 };
	sscanf(str, "%*s%s", buf);
	printf("4.使用sscanf读取字符串str，忽略空格前字符串，读取空格后字符，则得到buf为：%s\n", buf);
	//12345-->12345
#endif

	//5.%[width]s，读取指定宽度的数据；
	char* strSscanf = "12345abcde";
	memset(buf, 0, 1024);
	sscanf(strSscanf, "%6s", buf);
	printf("6.使用sscanf读取字符串strSscanf，读取6个字符，则得到buf为：%s\n", buf);//12345a

	//7.%[a-z]，匹配a到z中任意字符（尽可能多的匹配）；
	memset(buf, 0, 1024);
	sscanf(strSscanf, "%*d%[a-c]", buf);
	printf("8.使用sscanf读取字符串strSscanf，忽略掉数字，读取a-c的字符，则得到buf为：%s\n", buf);//abc

	//9.%[aBc]，匹配a,B,c中的一员，贪婪性；
	char* straBc = "aABbcde";
	memset(buf, 0, 1024);
	sscanf(straBc, "%[aAb]", buf);
	printf("10.使用sscanf读取字符串straBc，只读取字符aAb，则得到buf为：%s\n", buf);//aA

	//11.%[^a]，匹配非a的任意字符，贪婪性；
	char* strNotA = "aABbcde";
	memset(buf, 0, 1024);
	sscanf(strNotA, "%[^c]", buf);
	printf("12.使用sscanf读取字符串strNotA，只读取非c的字符，读到c就停止读取，则得到buf为：%s\n", buf);//aABb

	//13.%[^a-z]，表示读取除a-z以外的所有字符；
	char* strNotAToZ = "aABbcde12345";
	memset(buf, 0, 1024);
	sscanf(strNotAToZ, "%[^0-9]", buf);
	printf("14.使用sscanf读取字符串strNotAToZ，只读取非0-9的数字字符，读到0-9就停止读取，则得到buf为：%s\n", buf);
	//aABbcde

	char* ip = "127.0.0.1";
	int num1 = 0, num2 = 0, num3 = 0, num4 = 0;
	sscanf(ip, "%d.%d.%d.%d", &num1, &num2, &num3, &num4);
	printf("15.按格式读取字符串ip，读取出4个数字，即num1,num2,num3,num4为：%d, %d, %d, %d\n", num1, num2, num3, num4);
	//127, 0, 0, 1

	char* strTest = "abcde#12uiop@0plju";
	memset(buf, 0, 1024);
	sscanf(strTest, "%*[^#]#%[^@]", buf);
	printf("16.按格式读取strTest，先跳过非#的字符串，再跳过#，读取字符串，直到遇到@停止,buf为：%s\n", buf);//12uiop

}

//main194：sscanf格式化读取字符串
int main194()
{
	testSscanf();

	system("pause");
	return EXIT_SUCCESS;
}